#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
简化的机器人启动脚本 - 模块化版本
引用系统中其他文件实现功能
"""

import os
import sys
import logging
from flask import Flask
from dotenv import load_dotenv

# 导入模块化服务
from wx_crypto_service_new import WXBizMsgCrypt
from wx_api import WeChatAPI
from message_handler import MessageHandler
from webhook_routes import WebhookRoutes
from config import WXConfig, WXUtils

load_dotenv()

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

# Flask应用
app = Flask(__name__)

# 设置环境变量（在创建机器人实例之前）
def setup_environment():
    """设置环境变量"""
    print("🔧 正在配置环境变量...")
    
    # 设置默认环境变量
    env_vars = {
        'WEBHOOK_URL': 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=eb313ad3-b491-4d21-ae60-d1c93b9beef0',
        'SECRET': 'eb313ad3-b491-4d21-ae60-d1c93b9beef0',
        'WX_TOKEN': 'Sv3mVW1LOIU',
        'WX_AES_KEY': 'NgHrjQdRw46FQIyTedXxJu6GrjqcoewHWlCQVLA76Ai',
        'WX_CORPID': 'wxc4c1ad1d26dc0daf',
        'WX_RECEIVE_ID': 'wxc4c1ad1d26dc0daf',  # 企业微信客服OpenKfId
        "KF_ID": "wktI2SEAAABFbkw58saEfQgexjHIj5sQ",
        'WX_CORPSECRET': 'dMblb8p05YDN_uxiO8-DgRlPhXqHKc7aofUNC1Xlk6s',  # 企业微信应用的Secret，需要你填写
        'HOST': '0.0.0.0',
        'PORT': '5005',
        'LOG_LEVEL': 'INFO',
        'MAX_MESSAGE_LENGTH': '2000',
        'RESPONSE_TIMEOUT': '30'
    }
    
    for key, value in env_vars.items():
        if not os.getenv(key):
            os.environ[key] = value
            print(f"✅ 已设置 {key}")
    
    print("✅ 环境变量配置完成")

# 立即设置环境变量
setup_environment()

# 配置信息
class Config:
    # 企业微信群机器人配置
    WEBHOOK_URL = os.getenv('WEBHOOK_URL')  # 机器人的webhook地址
    SECRET = os.getenv('SECRET')  # 机器人安全设置中的签名密钥
    
    # 企业微信应用配置
    WX_TOKEN = os.getenv('WX_TOKEN')  # 企业微信Token
    WX_AES_KEY = os.getenv('WX_AES_KEY')  # 企业微信EncodingAESKey
    WX_CORPID = os.getenv('WX_CORPID')  # 企业微信CorpID（自建应用用）
    WX_RECEIVE_ID = os.getenv('WX_RECEIVE_ID')  # 企业微信客服OpenKfId（客服用）
    KF_ID = os.getenv('KF_ID')  # 企业微信客服OpenKfId（客服用）
    
    # 服务器配置
    HOST = os.getenv('HOST', '0.0.0.0')
    PORT = int(os.getenv('PORT', 5005))

class WeChatBot:
    """企业微信群机器人 - 模块化版本"""
    
    def __init__(self):
        self.config = Config()
        
        # 初始化企业微信API
        self.wx_api = WeChatAPI()
        
        # 初始化企业微信加密服务
        receive_id = self.config.WX_RECEIVE_ID
        if self.config.WX_TOKEN and self.config.WX_AES_KEY and receive_id:
            try:
                self.wx_crypto = WXBizMsgCrypt(
                    token=self.config.WX_TOKEN,
                    encoding_aes_key=self.config.WX_AES_KEY,
                    receive_id=receive_id
                )
                logger.info("✅ 企业微信加解密服务初始化成功（使用模块化版本）")
            except Exception as e:
                logger.error(f"❌ 企业微信加解密服务初始化失败: {str(e)}")
                self.wx_crypto = None
        else:
            self.wx_crypto = None
            logger.warning("⚠️ 企业微信加解密配置不完整，将使用明文模式")
        
        # 初始化消息处理器
        self.message_handler = MessageHandler(self.wx_api, self.wx_crypto)
        
        # 启动时获取客服账号列表
        self.init_kf_accounts()
    
    def init_kf_accounts(self):
        """初始化时获取客服账号列表"""
        try:
            logger.info("正在获取客服账号列表...")
            accounts_result = self.wx_api.get_kf_accounts()
            if accounts_result:
                account_list = accounts_result.get('account_list', [])
                if account_list:
                    logger.info(f"找到 {len(account_list)} 个客服账号:")
                    for i, account in enumerate(account_list, 1):
                        name = account.get('name', '未知账号')
                        open_kfid = account.get('open_kfid', '未知ID')
                        status = account.get('status', '未知状态')
                        logger.info(f"  {i}. {name} (OpenKfId: {open_kfid}, 状态: {status})")
                    
                    # 自动设置第一个账号的OpenKfId
                    first_account = account_list[0]
                    first_open_kfid = first_account.get('open_kfid')
                    if first_open_kfid:
                        # 更新环境变量
                        os.environ['KF_ID'] = first_open_kfid
                        self.config.KF_ID = first_open_kfid
                        logger.info(f"自动设置KF_ID为: {first_open_kfid}")
                else:
                    logger.warning("没有找到客服账号")
            else:
                logger.error("获取客服账号列表失败")
        except Exception as e:
            logger.error(f"初始化客服账号时发生错误: {str(e)}")
    
    def verify_url(self, msg_signature, timestamp, nonce, echostr):
        """验证URL有效性（企业微信回调配置时使用）"""
        if not self.wx_crypto:
            logger.error("企业微信加解密未配置，无法验证URL")
            return None
            
        try:
            # 使用模块化服务验证URL
            return self.wx_crypto.verify_url(msg_signature, timestamp, nonce, echostr)
        except Exception as e:
            logger.error(f"URL验证失败: {str(e)}")
            return None
    
    def decrypt_message(self, msg_signature, timestamp, nonce, encrypted_msg):
        """解密企业微信消息"""
        if not self.wx_crypto:
            logger.error("企业微信加解密未配置，无法解密消息")
            return None
            
        try:
            # 使用模块化服务解密消息
            return self.wx_crypto.decrypt_wechat_message(msg_signature, timestamp, nonce, encrypted_msg)
        except Exception as e:
            logger.error(f"消息解密失败: {str(e)}")
            return None
    
    def parse_xml_message(self, xml_content):
        """解析XML格式的企业微信消息"""
        return self.message_handler.parse_xml_message(xml_content)
    
    def call_ai_api(self, message):
        """调用AI API进行智能回复"""
        return self.message_handler.call_ai_api(message)
    
    def process_message(self, message_data):
        """处理接收到的消息"""
        try:
            # 解析消息内容
            msg_type = message_data.get('msg_type', '')
            content = message_data.get('content', '').strip()
            from_user = message_data.get('from_user', '')
            
            logger.info(f"收到来自 {from_user} 的 {msg_type} 消息: {content}")
            
            # 处理客服事件
            if msg_type == 'event' and 'kf_msg_or_event' in content:
                logger.info("收到客服事件，正在获取具体消息内容...")
                
                # 立即返回success，避免企业微信重复推送
                # 在后台异步处理消息
                self.message_handler.process_kf_message_async(self.wx_api, self.config)
                
                return "success"
            
            # 只处理文本消息
            if msg_type != 'text':
                return "抱歉，我只支持文本消息。"
            
            if not content:
                return "您好！我是AI助手，有什么可以帮助您的吗？"
            
            # 调用AI API
            response = self.call_ai_api(content)
            logger.info(f"AI回复: {response}")
            
            return response
            
        except Exception as e:
            logger.error(f"处理消息时发生错误: {str(e)}")
            return "抱歉，处理您的消息时出现了问题。"
    
    def process_message_async(self, message_data):
        """异步处理消息"""
        self.message_handler.process_message_async(message_data, self.config.WEBHOOK_URL)
    
    def get_current_timestamp(self):
        """获取当前时间戳"""
        if self.wx_crypto:
            return self.wx_crypto.get_current_timestamp()
        else:
            import time
            return str(int(time.time()))

# 创建机器人实例
bot = WeChatBot()

# 注册路由
routes = WebhookRoutes(app, bot)

def setup_logging():
    """设置日志"""
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        handlers=[
            logging.StreamHandler(sys.stdout),
            logging.FileHandler('bot.log', encoding='utf-8')
        ]
    )
    print("✅ 日志系统初始化完成")

def main():
    """主函数"""
    print("🤖 企业微信群机器人启动中... (模块化版本)")
    
    # 设置环境变量
    
    # 设置日志
    setup_logging()
    
    print("✅ AI API 已配置（使用llm.py）")
    print("✅ WEBHOOK_URL 已配置")
    print("✅ 企业微信加解密配置已设置（使用模块化加密服务）")
    print("✅ 企业微信API模块已加载")
    print("✅ 消息处理模块已加载")
    print("✅ Webhook路由模块已加载")
    
    print(f"🌐 服务地址: http://{bot.config.HOST}:{bot.config.PORT}")
    print(f"📡 Webhook地址: {bot.config.WEBHOOK_URL}")
    print("🚀 机器人已启动，等待消息...")
    
    # 启动Flask应用
    app.run(
        host=bot.config.HOST,
        port=bot.config.PORT,
        debug=False
    )

if __name__ == '__main__':
    main() 